--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / rrc / room_registry.py
Displaying Raw • Download
meshchatx/src/backend/rrc/room_registry.py 3f7ef731b5effd9aa3a81eceea66fd6c2b56498c (3f7ef731) Text, 10.16 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Room state, modes, and rooms.toml persistence for hosted RRC hubs."""
Tff7b72import T7ee787time
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787room_key_crypto Tff7b72import Te6edf3normalize_room_key
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787rooms_toml Tff7b72import Te6edf3INVITE_DEFAULT_TTL_S
Tff7b72def Td2a8ffdefault_room_stateTb4b4b4(Tff7b72*Tb4b4b4, Te6edf3founderTff7b72=Tff7b72NoneTb4b4b4, Te6edf3registeredTff7b72=Tff7b72FalseTb4b4b4, Te6edf3topicTff7b72=Tff7b72NoneTb4b4b4, Te6edf3privateTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4: Te6edf3founderTb4b4b4,
Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3registeredTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4: Te6edf3topicTb4b4b4,
Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3privateTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4: Tffa657setTb4b4b4(Tb4b4b4[Te6edf3founderTb4b4b4]Tb4b4b4) Tff7b72if Te6edf3founder Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicedTa5d6ff"Tb4b4b4: Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4: Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6fflast_used_tsTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Tb4b4b4}
Tff7b72class T56d364RoomRegistryTb4b4b4:
T8b949e"""Tracks per-room modes, ACLs, and registered room metadata."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTb4b4b4, Te6edf3toml_storeTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhub Tff7b72= Te6edf3hub
Tff7b72selfTff7b72.Td2a8ff_store Tff7b72= Te6edf3toml_store
Tff7b72selfTff7b72.Td2a8ff_registry Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_state Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72if Te6edf3toml_store Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_registry Tff7b72= Te6edf3toml_storeTff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3nameTb4b4b4, Te6edf3reg Tff7b72in Tff7b72selfTff7b72.Td2a8ff_registryTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4[Te6edf3nameTb4b4b4] Tff7b72= Tffa657dictTb4b4b4(Te6edf3regTb4b4b4)
Tff7b72def Td2a8ffreloadTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_store Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_registry Tff7b72= Tff7b72selfTff7b72.Td2a8ff_storeTff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3nameTb4b4b4, Te6edf3reg Tff7b72in Tff7b72selfTff7b72.Td2a8ff_registryTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4[Te6edf3nameTb4b4b4] Tff7b72= Tffa657dictTb4b4b4(Te6edf3regTb4b4b4)
Tff7b72def Td2a8ffget_stateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_stateTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72def Td2a8ffensure_stateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Tff7b72*Tb4b4b4, Te6edf3founderTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ff_stateTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72if Te6edf3st Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None Tff7b72and Te6edf3founder Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3founder
Te6edf3stTff7b72.Td2a8ffsetdefaultTb4b4b4(Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffaddTb4b4b4(Te6edf3founderTb4b4b4)
Tff7b72return Te6edf3st
Tff7b72if Te6edf3room Tff7b72in Tff7b72selfTff7b72.Td2a8ff_registryTb4b4b4:
Te6edf3base Tff7b72= Tffa657dictTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_registryTb4b4b4[Te6edf3roomTb4b4b4]Tb4b4b4)
Te6edf3invited Tff7b72= Te6edf3baseTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3invitedTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3baseTb4b4b4[Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4] Tff7b72= Tffa657dictTb4b4b4(Te6edf3invitedTb4b4b4)
Tff7b72for Te6edf3key Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvoicedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3val Tff7b72= Te6edf3baseTff7b72.Td2a8ffgetTb4b4b4(Te6edf3keyTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3valTb4b4b4, Tffa657setTb4b4b4) Tff7b72or Tffa657isinstanceTb4b4b4(Te6edf3valTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Te6edf3baseTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Tffa657setTb4b4b4(Te6edf3valTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3baseTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4[Te6edf3roomTb4b4b4] Tff7b72= Te6edf3base
Tff7b72return Te6edf3base
Te6edf3st Tff7b72= Te6edf3default_room_stateTb4b4b4(Te6edf3founderTff7b72=Te6edf3founderTb4b4b4, Te6edf3registeredTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_stateTb4b4b4[Te6edf3roomTb4b4b4] Tff7b72= Te6edf3st
Tff7b72return Te6edf3st
Tff7b72def Td2a8fftouch_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6fflast_used_tsTa5d6ff"Tb4b4b4] Tff7b72= Tffa657floatTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffregister_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4, Te6edf3founderTff7b72=Te6edf3kwargsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72if Ta5d6ff"Ta5d6fftopicTa5d6ff" Tff7b72in Te6edf3kwargsTb4b4b4:
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffprivateTa5d6ff" Tff7b72in Te6edf3kwargsTb4b4b4:
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4] Tff7b72= Tffa657boolTb4b4b4(Te6edf3kwargsTb4b4b4[Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72for Te6edf3flag Tff7b72in Tb4b4b4(
Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3flag Tff7b72in Te6edf3kwargsTb4b4b4:
Te6edf3stTb4b4b4[Te6edf3flagTb4b4b4] Tff7b72= Tffa657boolTb4b4b4(Te6edf3kwargsTb4b4b4[Te6edf3flagTb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffkeyTa5d6ff" Tff7b72in Te6edf3kwargsTb4b4b4:
Te6edf3key Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3key Tff7b72is Tff7b72None Tff7b72or Tb4b4b4(Tffa657isinstanceTb4b4b4(Te6edf3keyTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Tff7b72not Tffa657strTb4b4b4(Te6edf3keyTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3keyTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3normalize_room_keyTb4b4b4(Te6edf3keyTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6fffounderTa5d6ff" Tff7b72in Te6edf3kwargs Tff7b72and Te6edf3kwargsTb4b4b4[Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3kwargsTb4b4b4[Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4]
Te6edf3stTff7b72.Td2a8ffsetdefaultTb4b4b4(Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffaddTb4b4b4(Te6edf3kwargsTb4b4b4[Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_registryTb4b4b4[Te6edf3roomTb4b4b4] Tff7b72= Tffa657dictTb4b4b4(Te6edf3stTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpersistTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72def Td2a8ffunregister_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ff_stateTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72if Te6edf3st Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_registryTff7b72.Td2a8ffpopTb4b4b4(Te6edf3roomTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpersistTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72def Td2a8ffpersistTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_store Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ff_stateTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72if Tff7b72not Te6edf3st Tff7b72or Tff7b72not Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3merged Tff7b72= Tffa657dictTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_registryTb4b4b4)
Tff7b72if Te6edf3room Tff7b72in Te6edf3merged Tff7b72and Tff7b72not Te6edf3mergedTb4b4b4[Te6edf3roomTb4b4b4]Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3mergedTff7b72.Td2a8ffpopTb4b4b4(Te6edf3roomTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_storeTff7b72.Td2a8ffsaveTb4b4b4(Te6edf3mergedTb4b4b4)
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_registryTb4b4b4[Te6edf3roomTb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4: Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4: Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4: Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4: Tffa657setTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4) Tff7b72or Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicedTa5d6ff"Tb4b4b4: Tffa657setTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvoicedTa5d6ff"Tb4b4b4) Tff7b72or Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4: Tffa657setTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4) Tff7b72or Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4: Tffa657dictTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4) Tff7b72or Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fflast_used_tsTa5d6ff"Tb4b4b4: Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflast_used_tsTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_storeTff7b72.Td2a8ffsaveTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_registryTb4b4b4)
Tff7b72def Td2a8ffdelete_from_registryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_registryTff7b72.Td2a8ffpopTb4b4b4(Te6edf3roomTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_stateTff7b72.Td2a8ffpopTb4b4b4(Te6edf3roomTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_store Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_storeTff7b72.Td2a8ffsaveTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_registryTb4b4b4)
Tff7b72def Td2a8ffget_mode_stringTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3flags Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3flagsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffiTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)Tb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3flagsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffkTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3flagsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3flagsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3flagsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffpTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3flagsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6fftTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3flagsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4)
Tff7b72return Ta5d6ff"Ta5d6ff+Ta5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3flagsTb4b4b4) Tff7b72if Te6edf3flags Tff7b72else Ta5d6ff"Ta5d6ff(none)Ta5d6ff"
Tff7b72def Td2a8ffbroadcast_modeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3outgoingTb4b4b4)Tb4b4b4:
Te6edf3mode_txt Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_mode_stringTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3text Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffmode for Tffd700{Te6edf3roomTffd700}Ta5d6ff is now: Tffd700{Te6edf3mode_txtTffd700}Ta5d6ff"
Tff7b72for Te6edf3link Tff7b72in Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhubTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhubTff7b72.Td2a8ff_queue_noticeTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3textTb4b4b4)
Tff7b72def Td2a8ffis_room_opTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3peer_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3peer_hash Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhubTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffis_server_opTb4b4b4(Te6edf3peer_hashTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3founder Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3founderTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72and Tffa657bytesTb4b4b4(Te6edf3founderTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4(
Te6edf3peer_hashTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Te6edf3ops Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4)
Tff7b72return Tffa657isinstanceTb4b4b4(Te6edf3opsTb4b4b4, Tffa657setTb4b4b4) Tff7b72and Tffa657bytesTb4b4b4(Te6edf3peer_hashTb4b4b4) Tff7b72in Te6edf3ops
Tff7b72def Td2a8ffis_room_voicedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3peer_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3peer_hash Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_room_opTb4b4b4(Te6edf3roomTb4b4b4, Te6edf3peer_hashTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3voiced Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvoicedTa5d6ff"Tb4b4b4)
Tff7b72return Tffa657isinstanceTb4b4b4(Te6edf3voicedTb4b4b4, Tffa657setTb4b4b4) Tff7b72and Tffa657bytesTb4b4b4(Te6edf3peer_hashTb4b4b4) Tff7b72in Te6edf3voiced
Tff7b72def Td2a8ffis_room_moderatedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72return Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffis_room_bannedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3peer_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3peer_hash Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3bans Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4)
Tff7b72return Tffa657isinstanceTb4b4b4(Te6edf3bansTb4b4b4, Tffa657setTb4b4b4) Tff7b72and Tffa657bytesTb4b4b4(Te6edf3peer_hashTb4b4b4) Tff7b72in Te6edf3bans
Tff7b72def Td2a8ffis_invitedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3peer_hashTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3inv Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3invTb4b4b4, Tffa657dictTb4b4b4) Tff7b72or Tff7b72not Te6edf3invTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3now Tff7b72= Tffa657floatTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3exp Tff7b72= Te6edf3invTff7b72.Td2a8ffgetTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3peer_hashTb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3exp_f Tff7b72= Tffa657floatTb4b4b4(Te6edf3expTb4b4b4) Tff7b72if Te6edf3exp Tff7b72is Tff7b72not Tff7b72None Tff7b72else T79c0ff0.0
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3exp_f Tff7b72= T79c0ff0.0
Tff7b72if Te6edf3exp_f Tff7b72<Tff7b72= Te6edf3nowTb4b4b4:
Te6edf3invTff7b72.Td2a8ffpopTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3peer_hashTb4b4b4)Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffconsume_inviteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3peer_hashTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Remove a still-valid invite. Returns True if one was present."""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffis_invitedTb4b4b4(Te6edf3roomTb4b4b4, Te6edf3peer_hashTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3inv Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3invTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72return Te6edf3invTff7b72.Td2a8ffpopTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3peer_hashTb4b4b4)Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72not Tff7b72None
Tff7b72def Td2a8ffprune_expired_invitesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3inv Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3invTb4b4b4, Tffa657dictTb4b4b4) Tff7b72or Tff7b72not Te6edf3invTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3now Tff7b72= Tffa657floatTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3removed Tff7b72= Tff7b72False
Tff7b72for Te6edf3hTb4b4b4, Te6edf3exp Tff7b72in Tffa657listTb4b4b4(Te6edf3invTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3exp_f Tff7b72= Tffa657floatTb4b4b4(Te6edf3expTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3exp_f Tff7b72= T79c0ff0.0
Tff7b72if Te6edf3exp_f Tff7b72<Tff7b72= Te6edf3nowTb4b4b4:
Te6edf3invTff7b72.Td2a8ffpopTb4b4b4(Te6edf3hTb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3removed Tff7b72= Tff7b72True
Tff7b72return Te6edf3removed
Tff7b72def Td2a8ffadd_inviteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3peer_hashTb4b4b4, Te6edf3ttl_sTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3inv Tff7b72= Te6edf3stTff7b72.Td2a8ffsetdefaultTb4b4b4(Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)
Te6edf3ttl Tff7b72= Tffa657floatTb4b4b4(Te6edf3ttl_sTb4b4b4) Tff7b72if Te6edf3ttl_s Tff7b72is Tff7b72not Tff7b72None Tff7b72else Te6edf3INVITE_DEFAULT_TTL_S
Tff7b72if Te6edf3ttl Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Te6edf3ttl Tff7b72= Te6edf3INVITE_DEFAULT_TTL_S
Te6edf3invTb4b4b4[Tffa657bytesTb4b4b4(Te6edf3peer_hashTb4b4b4)Tb4b4b4] Tff7b72= Tffa657floatTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72+ Te6edf3ttl
Tff7b72def Td2a8ffroom_config_for_apiTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3ops Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4) Tff7b72or Tffa657setTb4b4b4(Tb4b4b4)
Te6edf3voiced Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvoicedTa5d6ff"Tb4b4b4) Tff7b72or Tffa657setTb4b4b4(Tb4b4b4)
Te6edf3bans Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4) Tff7b72or Tffa657setTb4b4b4(Tb4b4b4)
Te6edf3invited Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4) Tff7b72or Tb4b4b4{Tb4b4b4}
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3roomTb4b4b4,
Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4: Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffhas_keyTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Tffa657isinstanceTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)Tb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4: Tffa657bytesTb4b4b4(Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)
Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffoperatorsTa5d6ff"Tb4b4b4: Tffa657sortedTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3xTb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3x Tff7b72in Te6edf3opsTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicedTa5d6ff"Tb4b4b4: Tffa657sortedTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3xTb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3x Tff7b72in Te6edf3voicedTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4: Tffa657sortedTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3xTb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3x Tff7b72in Te6edf3bansTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffinvite_countTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Te6edf3invitedTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmodesTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffget_mode_stringTb4b4b4(Te6edf3roomTb4b4b4)Tb4b4b4,
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────